package marina;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

import marina.model.SungJuk2VO;

public class J20SungJuk {
	//숫자를 특정 형식에 맞춰 출력하는 도우미 클래스
	//NumberFormat	
	//DecimalFormat
	//format 메서드에 특정 패턴(0,#)을 이용해서 다양한 형식으로 숫자를 출력할 수 있음.
	public static void main(String[] args) {
		ArrayList<SungJuk2VO> mdb = new ArrayList<>();
		String hr = "-----------------------------------------";
		String newMsg1 = "새로운 성적 데이터를 입력합니다.";
		String newMsg2 = "이름 국어 영어 수학 순으로 입력하세요.";
		String newMsg3 = "성적 등록 완료!.";
		String newMsg4 = "성적 등록 실패!. - 숫자만 입력하세요.";
		String newMsg5 = "성적 등록 실패!. - 알 수 없는 오류 발생!"; // -> 메시지를 다 따로 만드는 구조는
														// 다국어 지원이 편리합니다.
		String readMsg1 = "전체 성적 데이터 출력";
		String readMsg2 = "검색할 성적 데이터의 이름을 입력하세요.";
		String readMsg3 = "데이터를 찾았습니다.";
		String readMsg4 = "찾는 데이터가 없습니다.";
		String modifyMsg1 = "기존 성적 데이터를 수정합니다.";
		String modifyMsg2 = "수정할 데이터의 이름을 입력하세요.";
		String modifyMsg3 = "이름 국어 영어 수학 순으로 입력하세요.";
		String modifyMsg4 = "수정 결과는 다음과 같습니다.";
		String modifyMsg5 = "찾는 데이터가 없어요.";
		String removeMsg1 = "특정 성적 데이터를 삭제합니다.";
		String removeMsg2 = "삭제할 데이터의 이름을 입력하세요.";
		String removeMsg3 = "성공적으로 삭제되었습니다.";
		String removeMsg4 = "삭제할 데이터를 찾지 못했습니다.";
		String dfmt1 = "000.00";
		String dfmt2 = "###.##";
		// 성적 데이터 입력 create
		Scanner sc = new Scanner(System.in);
		SungJuk2VO sj = null; // -> 객체는 되도록이면 늦게 만들어요.
		System.out.println(newMsg1);
		System.out.println(newMsg2);
		try {
			String name = sc.next(); // 이름 입력
			int kor = sc.nextInt(); // 국어 입력
			int eng = sc.nextInt(); // 영어 입력
			int mat = sc.nextInt(); // 수학 입력
			sj = new SungJuk2VO(name, kor, eng, mat);
			sj.setTot(sj.getKor() + sj.getEng() + sj.getMat());
			DecimalFormat df = new DecimalFormat(dfmt1);
			String avg = df.format((double)sj.getTot() / 3);
			sj.setAvg(Double.parseDouble(avg));
			switch((int)sj.getAvg() / 10){
			case 10 :
			case 9 :
				sj.setGrd('수');
				break;
			case 8 :
				sj.setGrd('우');
				break;
			case 7 :
				sj.setGrd('미');
				break;
			case 6 :
				sj.setGrd('양');
				break;
			default :
				sj.setGrd('가');
			}
			mdb.add(sj);	//ArrayList에 데이터 추가!
			System.out.println(newMsg3);
		} catch (InputMismatchException ime) {
			sj = null;	//-> 오류된 값을 가지고 있어선 안되니까~ 초기화 시켜줘요.
			System.out.println(newMsg4);
		} catch (Exception e) {
			sj = null;
			e.printStackTrace(); //자세한 오류 내용 출력
			System.out.println(newMsg5);
		}
		// 성적 데이터 조회 retrieve
		System.out.println(readMsg1);
		StringBuilder result = new StringBuilder();
		for(SungJuk2VO s : mdb){
			result.append(s.toString()).append("\n");
		}
		System.out.println(result);
		System.out.println(hr);
		// 성적 데이터 검색
		System.out.println(readMsg2);
		String key = sc.next();	//이름 입력받음
		SungJuk2VO findOne = null;
		for(SungJuk2VO s : mdb){
			if(s.getName().contains(key)){
				findOne = s;	//검색된 데이터를 findOne에 저장
				break;
			}//if
		} //for
		if(findOne != null){
			System.out.println(readMsg3);
			System.out.println(findOne);
		} else {
			System.out.println(readMsg4);
		}
		System.out.println(hr);
		// 성적 데이터 수정 update
		System.out.println(modifyMsg1);
		System.out.println(modifyMsg2);
		key = sc.next();
		findOne = null;		//수정할 데이터
		int position = 0;	//검색한 데이터의 위치
		for(SungJuk2VO s : mdb){
			if(s.getName().equals(key)){
				findOne = s;
				break;
			}//if
			++position;
		}//for
		if(findOne != null){
			System.out.println(findOne);
			System.out.println(modifyMsg3);
			findOne = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt());
			findOne.setTot(findOne.getKor() + findOne.getEng() + findOne.getMat());
			DecimalFormat df = new DecimalFormat(dfmt1);
			String avg = df.format((double)findOne.getTot() / 3);
			findOne.setAvg(Double.parseDouble(avg));
			switch((int)findOne.getAvg() / 10){
			case 10 :
			case 9 :
				findOne.setGrd('수');
				break;
			case 8 :
				findOne.setGrd('우');
				break;
			case 7 :
				findOne.setGrd('미');
				break;
			case 6 :
				findOne.setGrd('양');
				break;
			default :
				findOne.setGrd('가');
			}
			//수정된 입력값들을 ArrayList mdb에 반영
			mdb.set(position,findOne);
			System.out.println(modifyMsg4);
			System.out.println(mdb.get(position));
		} else {
			System.out.println(modifyMsg5);
		}
		System.out.println(hr);
		// 성적 데이터 삭제 delete
		System.out.println(removeMsg1);
		System.out.println(removeMsg2);
		key = sc.next();
		boolean findOk = false;
		position = 0;
		for(int i = 0; i < mdb.size(); ++i){	//*
			SungJuk2VO s = mdb.get(i);	//*
			if(s.getName().equals(key)){
				findOk = true;
				position = i;	//*
				break;
			}//if
		}//find
		if(findOk){
			mdb.remove(position);	//삭제
			System.out.println(removeMsg3);
			result = new StringBuilder();
			for(SungJuk2VO s : mdb){
				result.append(s.toString()).append("\n");
			}
			System.out.println(result);
		} else{
			System.out.println(removeMsg4);
		}
		// => C.R.U.D.
	}// main
}// class
